﻿package net.molchat.android.core;


// ========================================= Для перевода величин в байт-массивы
public class ToBytes {

//==================================================================== Константы
private final int QUERY_LEN = 24; // Макс. кол-во компонентов очереди

//=================================================================== Переменные
public int pt = 0; // Указатель чтения/записи

// Очередь
private byte[][] query; // Очередь сообщений
private int queryP; // Указатель на следующую своб. ячейку очереди
private int len; // Общая длина очереди, байт

//================================================================ Инициализация
public ToBytes() {

	query = new byte[QUERY_LEN][];
}


//============================================================ Вернуть результат
public byte[] getResult() {

	byte[] result = new byte[len];
	int pt = 0;

	for (int q = 0; q < queryP; ++q) {
		System.arraycopy(query[q], 0, result, pt, query[q].length);
		pt += query[q].length;
		query[q] = null;
	}

	return result;
}


//=============================================================== ФУНКЦИИ ЗАПИСИ
//============================================================== Записать булево
public void writeBool(boolean bool) {

	if (bool) {
		writeInt(1);
	} else {
		writeInt(0);
	}
}


//========================================================= Записать байт-массив
public void writeBytes(byte[] bytes) {

	query[queryP++] = bytes;
	len += bytes.length;
}


//=============================================================== Записать целое
public void writeInt(int number) {

	// Первый байт - младший

	int byteCount = 1;
	int toSend = number;

	do {
		toSend >>>= 7;
		if (toSend > 0) { // Еще есть биты
			byteCount++;
		}
	} while (toSend > 0);

	query[queryP] = new byte[byteCount];

	for (byteCount = 0; byteCount < query[queryP].length; ++byteCount) {
		toSend = number & 0x7f; // Первые 7 бит
		number >>>= 7;
		if (number > 0) { // Еще есть биты
			toSend |= 0x80;
		}
		query[queryP][byteCount] = (byte) toSend;
	}
	len += query[queryP].length;
	queryP++;
}


// ============================================================= Записать строку
public void writeString(String text) {

	if (text != null) {
		writeInt(text.length());
		writeBytes(Mat.utf2iso(text));
	} else {
		writeInt(0);
	}
}

}
